//
// Created by Ukua on 2023/11/2.
//

#ifndef JUSTFW_BSP_UART_H
#define JUSTFW_BSP_UART_H

#include "ringbuffer.h"
#include "interface.h"
#include "main.h"
#include "stdlib.h"
#include "tinybus.h"
#include <stdint.h>

#define BSP_UART_TX_FIFO_SIZE 8
#define BSP_UART_RX_FIFO_SIZE 8
#define DEVICE_UART_CNT 3     // C板至多分配3个串口
#define UART_RXBUFF_LIMIT 256 // 如果协议需要更大的buff,请修改这里
#define UART_TXBUFF_LIMIT 256 // 如果协议需要更大的buff,请修改这里


typedef struct UART_InstanceConfig{
    UART_HandleTypeDef *UART_handle;
    uint16_t recv_buff_size;
    char *tx_topic_name;
    char *rx_topic_name;
}UART_InstanceConfigTypeDef;

// 串口实例结构体,每个module都要包含一个实例.
// 由于串口是独占的点对点通信,所以不需要考虑多个module同时使用一个串口的情况,因此不用加入id;当然也可以选择加入,这样在bsp层可以访问到module的其他信息
typedef struct UART_Instance
{
    uint8_t recv_buff[UART_RXBUFF_LIMIT]; // 预先定义的最大buff大小,如果太小请修改UART_RXBUFF_LIMIT
    uint8_t recv_buff_size;                // 模块接收一包数据的大小
    UART_HandleTypeDef *uart_handle;      // 实例对应的uart_handle
    Bus_SubscriberTypeDef *tx_topic;
    Bus_TopicHandleTypeDef *rx_topic;
    uint8_t tx_buff[UART_TXBUFF_LIMIT];//环形缓冲区的buff
    uint8_t send_buff[UART_TXBUFF_LIMIT];//给dma缓存的buff

    ring_buffer_t  tx_ringBuffer;
    QueueHandle_t rx_queue;
} UART_InstanceTypeDef;

//消息缓冲
typedef struct UART_Buffer
{
    UART_InstanceTypeDef *uart_instance;
    INTF_UART_MessageTypeDef *message;
} UART_BufferTypeDef;

///接收缓冲，实际结构:
/***
typedef struct UART_RX_Buffer
{
//    UART_HandleTypeDef *UART_handle;
    uint16_t msg_len;
    uint8_t msg[recv_buff_size];
} UART_RX_BufferTypeDef;
***/
typedef struct UART_RX_Buffer_Header
{
//    UART_HandleTypeDef *UART_handle;
    uint16_t msg_len;
} UART_RX_Buffer_HeaderTypeDef;

/**
 * @brief 判断串口是否准备好,用于连续或异步的IT/DMA发送
 *
 * @param _instance 要判断的串口实例
 * @return uint8_t ready 1, busy 0
 */
uint8_t UARTIsReady(UART_InstanceTypeDef *_instance);


void BSP_UART_Init();

#endif //JUSTFW_BSP_UART_H
